#@ load("openapi.lib.yml", "response", "response_with_accepted", "reference", "type", "array")

paths:
  /collections/{collection_name}/snapshots/upload:
    post:
      tags:
        - snapshots
        - collections
      summary: Recover from an uploaded snapshot
      description: Recover local collection data from an uploaded snapshot. This will overwrite any data, stored on this node, for the collection. If collection does not exist - it will be created.
      operationId: recover_from_uploaded_snapshot
      parameters:
        - name: collection_name
          in: path
          description: Name of the collection
          required: true
          schema:
            type: string
        - name: wait
          in: query
          description: "If true, wait for changes to actually happen. If false - let changes happen in background. Default is true."
          required: false
          schema:
            type: boolean
        - name: priority
          in: query
          description: "Defines source of truth for snapshot recovery"
          required: false
          schema:
            $ref: "#/components/schemas/SnapshotPriority"
      requestBody:
        description: Snapshot to recover from
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                snapshot:
                  type: string
                  format: binary
      responses: #@ response_with_accepted(type("boolean"))
  /collections/{collection_name}/snapshots/recover:
    put:
      tags:
        - snapshots
        - collections
      summary: Recover from a snapshot
      description: Recover local collection data from a snapshot. This will overwrite any data, stored on this node, for the collection. If collection does not exist - it will be created.
      operationId: recover_from_snapshot
      parameters:
        - name: collection_name
          in: path
          description: Name of the collection
          required: true
          schema:
            type: string
        - name: wait
          in: query
          description: "If true, wait for changes to actually happen. If false - let changes happen in background. Default is true."
          required: false
          schema:
            type: boolean
      requestBody:
        description: Snapshot to recover from
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/SnapshotRecover"
      responses: #@ response_with_accepted(type("boolean"))

  /collections/{collection_name}/snapshots:
    get:
      tags:
        - snapshots
        - collections
      summary: List collection snapshots
      description: Get list of snapshots for a collection
      operationId: list_snapshots
      parameters:
        - name: collection_name
          in: path
          description: Name of the collection
          required: true
          schema:
            type: string
      responses: #@ response(array(reference("SnapshotDescription")))

    post:
      tags:
        - snapshots
        - collections
      summary: Create collection snapshot
      description: Create new snapshot for a collection
      operationId: create_snapshot
      parameters:
        - name: collection_name
          in: path
          description: Name of the collection for which to create a snapshot
          required: true
          schema:
            type: string
        - name: wait
          in: query
          description: "If true, wait for changes to actually happen. If false - let changes happen in background. Default is true."
          required: false
          schema:
            type: boolean
      responses: #@ response_with_accepted(reference("SnapshotDescription"))

  /collections/{collection_name}/snapshots/{snapshot_name}:
    delete:
      tags:
        - snapshots
        - collections
      summary: Delete collection snapshot
      description: Delete snapshot for a collection
      operationId: delete_snapshot
      parameters:
        - name: collection_name
          in: path
          description: Name of the collection for which to delete a snapshot
          required: true
          schema:
            type: string
        - name: snapshot_name
          in: path
          description: Name of the snapshot to delete
          required: true
          schema:
            type: string
        - name: wait
          in: query
          description: "If true, wait for changes to actually happen. If false - let changes happen in background. Default is true."
          required: false
          schema:
            type: boolean
      responses: #@ response_with_accepted(type("boolean"))
    get:
      tags:
        - snapshots
        - collections
      summary: Download collection snapshot
      description: Download specified snapshot from a collection as a file
      operationId: get_snapshot
      parameters:
        - name: collection_name
          in: path
          description: Name of the collection
          required: true
          schema:
            type: string
        - name: snapshot_name
          in: path
          description: Name of the snapshot to download
          required: true
          schema:
            type: string

      responses:
        default:
          description: error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorResponse"
        4XX:
          description: error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorResponse"
        '200':
          description: Snapshot file
          content:
            application/octet-stream:
              schema:
                type: string
                format: binary

  /snapshots:
    get:
      tags:
        - snapshots
      summary: List of storage snapshots
      description: Get list of snapshots of the whole storage
      operationId: list_full_snapshots
      responses: #@ response(array(reference("SnapshotDescription")))

    post:
      tags:
        - snapshots
      summary: Create storage snapshot
      description: Create new snapshot of the whole storage
      operationId: create_full_snapshot
      parameters:
        - name: wait
          in: query
          description: "If true, wait for changes to actually happen. If false - let changes happen in background. Default is true."
          required: false
          schema:
            type: boolean
      responses: #@ response_with_accepted(reference("SnapshotDescription"))

  /snapshots/{snapshot_name}:
    delete:
      tags:
        - snapshots
      summary: Delete storage snapshot
      description: Delete snapshot of the whole storage
      operationId: delete_full_snapshot
      parameters:
        - name: snapshot_name
          in: path
          description: Name of the full snapshot to delete
          required: true
          schema:
            type: string
        - name: wait
          in: query
          description: "If true, wait for changes to actually happen. If false - let changes happen in background. Default is true."
          required: false
          schema:
            type: boolean
      responses: #@ response_with_accepted(type("boolean"))
    get:
      tags:
        - snapshots
      summary: Download storage snapshot
      description: Download specified snapshot of the whole storage as a file
      operationId: get_full_snapshot
      parameters:
        - name: snapshot_name
          in: path
          description: Name of the snapshot to download
          required: true
          schema:
            type: string
      responses:
        default:
          description: error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorResponse"
        4XX:
          description: error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorResponse"
        '200':
          description: Snapshot file
          content:
            application/octet-stream:
              schema:
                type: string
                format: binary
